查看原文
其他

评价指标设计

机智的叉烧 CS的陋室 2022-08-08

往期回顾:

本来这篇文章想放在[手把手搞推荐]这个系列里,写完了感觉更像综合性的,只是用了这里面的例子,所以把前缀都去了。

评价指标,是判定一个问题你是否已经达到要求,你做的事情是否正确,监控系统是否正常运行的重要指标,因此,他的合理设计在整个算法流程中非常关键的一步,这方面的工作比较玄学复杂,我尝试性的总结了一下设计的经验,写完感觉额,什么都没说,当做我水水这样子吧,不过还是希望对大家有用。

懒人目录

在这里先画重点:

  • 业务指标和性能指标注意区分,在实际情况下可能还会转化,关键还是在于业务指标。

  • 面向你的目标设计评价指标,道理都懂,要想得到并且会去做。

  • “对不对”和“差多远”,两个思路展开设计指标。

  • 多看case,多分析。

  • 指标只能告诉你事情成不成,具体为什么成,你得看你的流程和结果细节。

然后是目录:

  • 讲道理时间

  • 理论指标

  • 业务指标

  • 设计思路

  • 举例子

讲道理时间

很多人都说,分类查准率、查全率、F1,加个AUC就完事,回归MAE,MSE就拉到,不得不说,这些确实是非常重要的指标,但是在现实应用中,这些指标绝对不够,甚至不能太看,具体细节是怎么样的,且听我细细道来。

首先,我一般会把指标分为两种,业务指标和理论指标,划分不严格,但是理解起来比较容易。

理论指标

理论指标,就是我们常做模型使用的指标,分类的查准率、查全率、F1、AUC,回归的MAE,MSE,都是理论指标,这些理论指标都是用来描述我们模型在数学原理上的“对不对”。

例如,分类的查全率,如recall,就是衡量模型分的对不对的能力,给定实际标签然后和预测标签进行比对的结果,用西瓜书的说法就是“能不能把坏瓜找全”这样的一个含义。

业务指标

业务指标来源于实际问题,是判断整个事情有没做好的指标,对模型而言,就是衡量模型“好不好”的指标,有时候理论指标好的模型并不一定有好的业务指标,此时应该更加关注业务指标。例如做推荐除了关注AUC这种理论指标,从产品层面需要关注转化率、流失率等,推荐系统还要看MRR之类的,这些问题都来源于实际问题,做模型解决问题的核心原因,在商业最最终极的还是在于赚钱,所以关心成本和收益,关注用户流量,留存情况,这些都是业务指标。

业务指标有一个特点,大都是线下实验无法检测的,因为没有用户实际使用的体验信息,所以常采用AB实验的方式对模型或者特征策略的改进进行测验,业务指标好了才是真的好。

设计思路

知道这两个概念了,那么如何设计呢,其实简单地说就是,回头看你的目标——根据目标设计。

所有事情都有目标,那么除了目标本身以外,还需要分析的是“什么样叫做达到了目标”,大学校园里出现最多的目标就是“不挂科”,什么叫做不挂科,我期末考试60分以上就叫做不挂科,这个60分就是评判指标。

我这里给出两个进一步设计的思路——对不对差多远

对不对是非常直接进行指标设计的思路,例如我做分类,对单个问题而言,我就是希望看对不对,非常好理解,对单个问题好理解,那多余数据集整体,accuracy,即全部样本里面对的有几个,就出来了。再举大学希望不挂科的例子,我看对不对,其实就是看我的挂科率,关注的是“挂没挂”,挂科率的指标就有了。

差多远是一个相对间接的方法,例如我做的是回归问题,往往不能精准打到最优解,那我就要分析差多远了,对于数据集整体情况,平均误差就有了,一般是MAE或者MSE,很容易导出。再举大学希望不挂科的例子,我看差多远,我会看平均分。会看实际每门课的分数距离60分差多少,高低多少。

但是值得注意的是,对于我现在的处境其实不关注过了60分的具体多少,毕竟“60分万岁”,而关注没到60分的差多少,我们甚至可以构建一个“合页误差”,为了检查和挂科差多远,我们只看小于60分的科目距离60分有多少,大于60分的误差都是0,这样方便检测我的挂科情况,指标就设计出来了。

再举一个比较复杂但是颇为直观的例子,推荐系统里面的排序,例如简单地希望让点击率高的结果在前面,那我不仅仅要判断准确率本身,还要判断我这个点击率到底靠不靠谱,怎么看,可以看看用户第一个点击的位置是否排在前面,nDCG就有了。

另外,很多时候指标的设计并非一蹴而就,而是设计后经过分析和判断之后更新改进得到的。

别的说的都有点飘了,来看看一个指标要追求极致应该怎么设计和分析。

举例子

还是拿movielens作为例子。前情提要可以看我这些链接。

我在我的例子目标是做一个打分预估模型,在此时我的核心目标在于让打分尽可能准,因此起初我设计的是这几个指标:

precision,recall,F1,MAE,MSE

虽然这个打分实际上是一个回归问题,但实际上我当做是分类问题解决,此时关注的是“对不对”的问题,对于分类问题本身,我应该去看清三大经典分类指标,由于不是二分类所以AUC就没看了,这是从模型层面去分析的,分类问题要看分类指标,所以三大经典分类指标是一个理论指标,然而由于打分问题实际上是回归问题,所以我应该更关注误差是多少,(对于分类指标而言,实际是4分,你的模型给1分和给3分都算错,但我们都知道1分差的更远,然而分类指标无法体现这个)即“差多少”的问题,因此我们需要做的就是MAE和MSE。

然而再进一步,用分类结果得到的打分虽然是实际预测得分,但是如果两个模型都预测为4分,实际也是4分,我们无法知道谁更接近,于是我们可以借助分类时给的概率来判断,模型A预测4分的概率是0.8,模型B预测的4分概率是0.85,那肯定在这个样本下模型B比A好,所以我们可以对比正确分类的的概率的均值来分高下,甚至,我们可以比整个预测的概率和实际onehot下的欧氏距离,来看看代码怎么写的,这个写起来其实比较简单也比较好理解了。

  1. def eu_distances(array1, array2):

  2. res = 0.0

  3. for idx in range(len(array1)):

  4. res = res + (array1[idx] - array2[idx]) ** 2

  5. return res / len(array1)


  6. def average_distance(y_true_prod, y_pred_prod):

  7. res = 0.0

  8. for idx in range(len(y_true_prod)):

  9. res = res + eu_distances(y_true_prod[idx], y_pred_prod[idx])

  10. return res / len(y_true_prod)

够吗,感觉还不够,这里面有个问题,实际分数是4分,onehot下应为[0,0,0,1,0],模型A预测结果为[0.2,0,0,0.8,0],模型B预测结果为[0,0,0.2,0.8,0],这两个差距还是一样的,这个犯了和使用分类指标类似的问题。所以我能不能求一个期望分数,看看和实际分数的差距,这个当然可以有,通过预测的概率和对应得分求期望即可得到期望分数,1分的概率乘以1加上2分的概率乘以2以此类推,再拿这个分数和实际分数对比,这个差距算MAE或者MSE就更为精准了,我把它称为期望分数MAE和期望分数MSE,上代码。

  1. from sklearn.metrics import mean_absolute_error, mean_squared_error


  2. def exp_score(y_pred_prod, classes_get):

  3. exp_get = 0.0

  4. for idx in range(len(y_pred_prod)):

  5. exp_get = exp_get + y_pred_prod[idx] * classes_get[idx]

  6. return exp_get


  7. def exp_score_batch(y_pred_prod, classes_get):

  8. exp_get = []

  9. for idx in range(len(y_pred_prod)):

  10. exp_get.append(exp_score(y_pred_prod[idx], classes_get))

  11. return exp_get


  12. exp_sc = exp_score_batch(y_test_oh, clf.classes_) # 期望分数

  13. exp_mae = mean_absolute_error(exp_sc, y_pred) # 期望分数MAE

  14. exp_mse = mean_squared_error(exp_sc, y_pred) # 期望分数MSE

当然了,在这个lr分类模型层面,这个期望分数MAE和期望分数MSE已经算是业务指标了,毕竟我们要求的是打分尽可能准,但是对于整个推荐系统而言,还是只是性能指标,我们可能还要通过上线了解用户实际的打分情况、喜好程度,另外的停留时间、上线频次等,其实是针对用户体验本身的指标,我们同样要在上线后的AB实验进行监控,这个才是最终的业务指标。

当然这个指标也不见得是个好指标,后面可能还有改进,有兴趣的可以和我聊聊,我今天的重点在聊思路。

后记

要问我最终怎么设计指标的,说白了还是经验,加上前辈给的意见,才有了一些想法,很多时候,新的指标设计来源于业务目标,指标就是为了评判成败而生的,另一方面,评判的过程中我们会发现一些不合理的地方,然后会改进,所以综上,我再给几个建议。

  • 多看case,理解数据,理解数据结果,理解业务。

  • 看指标的目的是为了告诉你事情成没成,有多好,具体为什么,怎么改进,至少他办不到,你得找别的去,原因要看你的过程和本身的数据集,看改进要分析badcase。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存